home *** CD-ROM | disk | FTP | other *** search
/ Aminet 51 / Aminet 51 (2002)(GTI - Schatztruhe)[!][Oct 2002].iso / Aminet / dev / c / minigl.lha / MiniGL / demos / gravity.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-03-27  |  4.8 KB  |  290 lines

  1. #include <mgl/gl.h>
  2.  
  3. #include <stdlib.h>
  4.  
  5.  
  6. GLint width=640; GLint height=480;
  7.  
  8. GLfloat eye[3] = {15.0, 8.0, 0.0};
  9. GLfloat look[3] = {0.0, 0.0, 0.0};
  10.  
  11. GLubyte texture[768];
  12.  
  13. char *texture_ascii[] =
  14. {
  15.        "################",
  16.        "################",
  17.        "#######@@#######",
  18.        "#####@@88@@#####",
  19.        "####@8oooo8@####",
  20.        "####@o+--+o@####",
  21.        "###@8o-..-o8@###",
  22.        "###@8+-  -+8@###",
  23.        "####@o+--+o@####",
  24.        "####@8oooo8@####",
  25.        "#####@@88@@#####",
  26.        "#######@@#######",
  27.        "################",
  28.        "################",
  29.        "################",
  30.        "################"
  31. };
  32.  
  33. #define MAX_PARTICLES 512
  34.  
  35. struct Particle
  36. {
  37.     GLboolean used;     // flag: is this entry used
  38.     GLfloat x, y, z;    // Position
  39.     GLfloat dx, dy, dz; // Directional velocity
  40.     GLfloat r,g,b;      // Color
  41.     GLint age;          // Age
  42. };
  43.  
  44. struct Particle psystem[MAX_PARTICLES];
  45.  
  46. void CreateTexture()
  47. {
  48.     int i, j;
  49.     GLubyte *t = texture;
  50.  
  51.     for (i = 0; i < 16; i++)
  52.     {
  53.         for (j = 0; j < 16; j++)
  54.         {
  55.             switch (texture_ascii[i][j])
  56.             {
  57.                 case '#':
  58.                     *t++ = 0;       // R
  59.                     *t++ = 0;       // G
  60.                     *t++ = 0;       // B
  61.                     break;
  62.                 case '@':
  63.                     *t++ = 32;
  64.                     *t++ = 32;
  65.                     *t++ = 32;
  66.                     break;
  67.                 case '8':
  68.                     *t++ = 64;
  69.                     *t++ = 64;
  70.                     *t++ = 64;
  71.                     break;
  72.                 case 'o':
  73.                     *t++ = 96;
  74.                     *t++ = 96;
  75.                     *t++ = 96;
  76.                     break;
  77.                 case '+':
  78.                     *t++ = 128;
  79.                     *t++ = 128;
  80.                     *t++ = 128;
  81.                     break;
  82.                 case '-':
  83.                     *t++ = 160;
  84.                     *t++ = 160;
  85.                     *t++ = 160;
  86.                     break;
  87.                 case '.':
  88.                     *t++ = 192;
  89.                     *t++ = 192;
  90.                     *t++ = 192;
  91.                     break;
  92.                 case ' ':
  93.                     *t++ = 240;
  94.                     *t++ = 240;
  95.                     *t++ = 240;
  96.                     break;
  97.             }
  98.         }
  99.     }
  100.  
  101.     glBindTexture(GL_TEXTURE_2D, 1);
  102.     glTexImage2D(GL_TEXTURE_2D, 0, 3, 16, 16,
  103.         0, GL_RGB, GL_UNSIGNED_BYTE, texture);
  104.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  105.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  106. }
  107.  
  108.  
  109. void reshape(int w, int h)
  110. {
  111.     glMatrixMode(GL_PROJECTION);
  112.     glLoadIdentity();
  113.     gluPerspective(70.0, 1.3333333, 1.0, 100.0);
  114.  
  115.     glMatrixMode(GL_MODELVIEW);
  116.     glViewport(0, 0, w, h);
  117.     glClearColor(0.0f, 0.f, 0.f, 1.f);
  118.     glClearDepth(1.0);
  119. }
  120.  
  121. void UpdateParticles(void)
  122. {
  123.     int i;
  124.     int cRate = 5;
  125.  
  126.     for (i = 0; i < MAX_PARTICLES; i++)
  127.     {
  128.         if (psystem[i].used)
  129.         {
  130.             psystem[i].x += psystem[i].dx;
  131.             psystem[i].y += psystem[i].dy;
  132.             psystem[i].z += psystem[i].dz;
  133.  
  134.             glPushMatrix();
  135.             glTranslatef(psystem[i].x, psystem[i].y, psystem[i].z);
  136.  
  137.             glColor3f(psystem[i].r, psystem[i].g, psystem[i].b);
  138.  
  139.             glBegin(GL_QUADS);
  140.                 glTexCoord2f(0.0, 0.0);
  141.                 glVertex3f(-0.5, 0.5, 0.0);
  142.                 glTexCoord2f(1.0, 0.0);
  143.                 glVertex3f(0.5, 0.5, 0.0);
  144.                 glTexCoord2f(1.0, 1.0);
  145.                 glVertex3f(0.5, -0.5, 0.0);
  146.                 glTexCoord2f(0.0, 1.0);
  147.                 glVertex3f(-0.5, -0.5, 0.0);
  148.             glEnd();
  149.  
  150.             glPopMatrix();
  151.  
  152.             psystem[i].age++;
  153.  
  154.             if (psystem[i].age > 100)
  155.                 psystem[i].used = GL_FALSE;
  156.         }
  157.         else
  158.         {
  159.             cRate--;
  160.             if (cRate == 0) break;
  161.  
  162.             psystem[i].x = (GLfloat)(rand()%20) - 10.0;
  163.             psystem[i].y = 10.0;
  164.             psystem[i].z = (GLfloat)(rand()%20) - 10.0;
  165.  
  166.             psystem[i].dx = 0.0;
  167.             psystem[i].dy = -0.2;
  168.             psystem[i].dz = 0.0;
  169.  
  170.             psystem[i].r = (GLfloat)(rand()%255)/255.0;
  171.             psystem[i].g = (GLfloat)(rand()%255)/255.0;
  172.             psystem[i].b = (GLfloat)(rand()%255)/255.0;
  173.  
  174.             psystem[i].used = GL_TRUE;
  175.             psystem[i].age = 0;
  176.         }
  177.     }
  178. }
  179.  
  180. void DoFrame(void)
  181. {
  182.     mglLockDisplay();
  183.  
  184.     glClearColor(0.0f, 0.f, 0.f, 1.f);
  185.     glClearDepth(1.0);
  186.     glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
  187.     glEnable(GL_DEPTH_TEST);
  188.     glDisable(GL_CULL_FACE);
  189.  
  190.     glMatrixMode(GL_MODELVIEW);
  191.     glLoadIdentity();
  192.     gluLookAt(eye[0], eye[1], eye[2], look[0], look[1], look[2], 0.0, 1.0, 0.0);
  193.  
  194.     glDisable(GL_TEXTURE_2D);
  195.     glDisable(GL_BLEND);
  196.  
  197.     glColor3f(0.2, 0.8, 0.2);
  198.  
  199.     glBegin(GL_QUADS);
  200.         glVertex3f(-10.0, 0.0, -10.0);
  201.         glVertex3f(10.0, 0.0, -10.0);
  202.         glVertex3f(10.0, 0.0, 10.0);
  203.         glVertex3f(-10.0, 0.0, 10.0);
  204.     glEnd();
  205.  
  206.     glEnable(GL_TEXTURE_2D);
  207.     glEnable(GL_BLEND);
  208.  
  209.     UpdateParticles();
  210.  
  211.     glFlush();
  212.  
  213.     mglUnlockDisplay();
  214.     mglSwitchDisplay();
  215. }
  216.  
  217. #ifndef __VBCC__
  218. void keys(unsigned char c)
  219. {
  220.  
  221.     switch (c)
  222.     {
  223.         case 0x1b:
  224.             mglExit();
  225.             break;
  226.     }
  227. }
  228. #else
  229. void keys(char c)
  230. {
  231.  
  232.     switch (c)
  233.     {
  234.         case 0x1b:
  235.             mglExit();
  236.             break;
  237.     }
  238. }
  239. #endif
  240.  
  241. #ifdef __VBCC__
  242. int
  243. #else
  244. void
  245. #endif
  246. main(int argc, char *argv[])
  247. {
  248.     int i;
  249.  
  250.     for (i=1; i<argc; i++)
  251.     {
  252.         if (0 == stricmp(argv[i], "-width"))
  253.         {
  254.             i++;
  255.             width = atoi(argv[i]);
  256.         }
  257.         if (0 == stricmp(argv[i], "-height"))
  258.         {
  259.             i++;
  260.             height = atoi(argv[i]);
  261.         }
  262.         if (0 == stricmp(argv[i], "-window"))
  263.         {
  264.             mglChooseWindowMode(GL_TRUE);
  265.         }
  266.     }
  267.  
  268.     MGLInit();
  269.  
  270.     mglChooseVertexBufferSize(1000);
  271.     mglChooseNumberOfBuffers(3);
  272.     mglCreateContext(0,0,width,height);
  273.     mglEnableSync(GL_FALSE);
  274.  
  275.     reshape(width, height);
  276.  
  277.     CreateTexture();
  278.  
  279.     mglIdleFunc(DoFrame);
  280.     mglKeyFunc(keys);
  281.     mglMainLoop();
  282.  
  283.  
  284.     mglDeleteContext();
  285.     MGLTerm();
  286. #ifdef __VBCC__
  287.     return 0;
  288. #endif
  289. }
  290.